package com.mars.admin.modules.post.mapper;

import com.mars.admin.modules.post.entity.Post;
import com.mars.admin.modules.post.dto.PostWithUserDTO;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 帖子Mapper接口
 *
 * @author Mars
 * @version 1.0
 * @date 2025-01-07
 */
@Mapper
public interface PostMapper extends BaseMapper<Post> {

    /**
     * 根据用户ID查询帖子列表
     *
     * @param userId 用户ID
     * @return 帖子列表
     */
    Page<Post> selectPostListByUserId(@Param("userId") Long userId, @Param("page") Page<Post> page);

    /**
     * 根据话题ID查询帖子列表
     *
     * @param topicId 话题ID
     * @param page    分页参数
     * @return 帖子列表
     */
    Page<Post> selectByTopicId(@Param("topicId") Long topicId, @Param("page") Page<Post> page);

    /**
     * 查询热门帖子
     *
     * @param page 分页参数
     * @return 热门帖子列表
     */
    Page<Post> selectHotPosts(@Param("page") Page<Post> page);

    /**
     * 查询推荐帖子
     *
     * @param page 分页参数
     * @return 推荐帖子列表
     */
    Page<Post> selectRecommendPosts(@Param("page") Page<Post> page);

    /**
     * 根据关注用户查询动态
     *
     * @param userId 当前用户ID
     * @param page   分页参数
     * @return 关注用户的帖子列表
     */
    Page<Post> selectFollowingPosts(@Param("userId") Long userId, @Param("page") Page<Post> page);

    /**
     * 根据地区查询帖子
     *
     * @param regionId 地区ID
     * @param page     分页参数
     * @return 帖子列表
     */
    Page<Post> selectByRegion(@Param("regionId") Long regionId, @Param("page") Page<Post> page);

    /**
     * 搜索帖子
     *
     * @param keyword 关键词
     * @param page    分页参数
     * @return 帖子列表
     */
    Page<Post> searchPosts(@Param("keyword") String keyword, @Param("page") Page<Post> page);

    /**
     * 更新帖子统计数据
     *
     * @param postId       帖子ID
     * @param viewCount    浏览数增量
     * @param likeCount    点赞数增量
     * @param commentCount 评论数增量
     * @param shareCount   分享数增量
     * @param collectCount 收藏数增量
     * @return 更新结果
     */
    int updatePostStats(@Param("postId") Long postId,
            @Param("viewCount") Integer viewCount,
            @Param("likeCount") Integer likeCount,
            @Param("commentCount") Integer commentCount,
            @Param("shareCount") Integer shareCount,
            @Param("collectCount") Integer collectCount);

    /**
     * 查询用户收藏的帖子
     *
     * @param userId 用户ID
     * @param page   分页参数
     * @return 收藏的帖子列表
     */
    Page<Post> selectCollectedPosts(@Param("userId") Long userId, @Param("page") Page<Post> page);

    /**
     * 查询用户点赞的帖子
     *
     * @param userId 用户ID
     * @param page   分页参数
     * @return 点赞的帖子列表
     */
    Page<Post> selectLikedPosts(@Param("userId") Long userId, @Param("page") Page<Post> page);

    /**
     * 查询待审核的帖子
     *
     * @param page 分页参数
     * @return 待审核帖子列表
     */
    Page<Post> selectPendingAuditPosts(@Param("page") Page<Post> page);

    /**
     * 分页查询帖子列表（关联用户信息）
     *
     * @param page        分页参数
     * @param userId      用户ID（可选）
     * @param topicId     话题ID（可选）
     * @param postType    帖子类型（可选）
     * @param isHot       是否热门（可选）
     * @param isRecommend 是否推荐（可选）
     * @param status      状态（可选）
     * @param auditStatus 审核状态（可选）
     * @return 帖子列表（包含用户信息）
     */
    Page<PostWithUserDTO> selectPostListWithUser(@Param("page") Page<PostWithUserDTO> page,
            @Param("userId") Long userId,
            @Param("topicId") Long topicId,
            @Param("postType") Integer postType,
            @Param("isHot") Integer isHot,
            @Param("isRecommend") Integer isRecommend,
            @Param("status") Integer status,
            @Param("auditStatus") Integer auditStatus);
}
